<?php 
namespace Admin\Controller;
use Think\Controller;

class JssdkController extends Controller {
    public function _initialize()
    {
        $jssdk = new JSSDK("wx49d791b01a88457b", "193ed4511f8f12adb8c626a5f8d032fa");
        $signPackage = $jssdk->GetSignPackage();
        $this->assign('signPackage',$signPackage);
    }
}

class JSSDK {  
  private $appId;  
  private $appSecret;  
   
  public function __construct($appId, $appSecret) {  
    $this->appId = $appId;  
    $this->appSecret = $appSecret;  
  }  
   
  public function getSignPackage() {  
    $jsapiTicket = $this->getJsApiTicket();  
   
    // 注意 URL 一定要动态获取，不能 hardcode.  
    $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";  
    $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";  
   
    $timestamp = time();  
    $nonceStr = $this->createNonceStr();  
   
    // 这里参数的顺序要按照 key 值 ASCII 码升序排序  
    $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";  
   
    $signature = sha1($string);  
   
    $signPackage = array(  
      "appId"     => $this->appId,  
      "nonceStr"  => $nonceStr,  
      "timestamp" => $timestamp,  
      "url"       => $url,  
      "signature" => $signature,  
      "rawString" => $string  
    );  
    return $signPackage;   
  }  
   
  private function createNonceStr($length = 16) {  
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";  
    $str = "";  
    for ($i = 0; $i < $length; $i++) {  
      $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);  
    }  
    return $str;  
  }  
   
  private function getJsApiTicket() {  
       
      $accessToken = $this->getAccessToken();  
        
      // 如果是企业号用以下 URL 获取 ticket  
      // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";  
      $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";  
      $res = json_decode($this->httpGet($url));  
        
      $ticket = $res->ticket;  
         
    return $ticket;  
  }  
   
  public function getAccessToken() {  
    // access_token 应该全局存储与更新，以下代码以写入到文件中做示例  
    // 如果是企业号用以下URL获取access_token  
    $data = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT']."/Public/access_token.json"));//建立一个文件把第一次请求到的token对象放进去
       if (empty($data) || $data->expire_time < time()) {
          $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$this->appId.'&secret='.$this->appSecret;
          $res = json_decode($this->httpGet($url));
          $access_token = $res->access_token;
          if ( $access_token ) {
             $data->expire_time = time() + ($res->expires_in - 100);
             $data->access_token = $access_token;
             $fp = fopen($_SERVER['DOCUMENT_ROOT']."/Public/access_token.json", "w");
             fwrite($fp, json_encode($data));
             fclose($fp);
          }
       } else {
        $access_token = $data->access_token;
     }
 
     return $access_token;
  }  
   
  private function httpGet($url) {  
    $curl = curl_init();  
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);  
    curl_setopt($curl, CURLOPT_TIMEOUT, 500);  
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);  
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);  
    curl_setopt($curl, CURLOPT_URL, $url);  
   
    $res = curl_exec($curl);  
    curl_close($curl);  
   
    return $res;  
  }  
  
}

 ?>